#ifndef __WED_THREAD_H__
#define __WED_THREAD_H__

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "Wed_framework_config.h"
#include "Wed_errno.h"
#include "mem/Wed_mem.h"
#include "print/Wed_print.h"

#if WED_KERNEL_FREERTOS
#include "FreeRTOS.h"
#include "task.h"

#define Wed_thread_func_t TaskFunction_t
#define WED_THREAD_PRIOTITY_LOWEST (configMAX_PRIORITIES - 1)

#endif

/* \brief 线程结构体 */
struct Wed_thread {
#if WED_KERNEL_FREERTOS
    StaticTask_t task_handle;
#if WED_MEM_DYMANICS
    TaskHandle_t p_task_handle;
#endif
#endif
};

/**
 * \brief 线程动态创建
 *
 * @param p_thread_func     线程运作函数
 * @param p_thread_func_arg 线程运作函数参数
 * @param p_thread_name     线程名字
 * @param thread_stack_size 线程栈大小
 * @param thread_Priority   线程优先级
 *
 * @return 成功返回线程结构体
 */
struct Wed_thread *Wed_thread_create(Wed_thread_func_t  p_thread_func,
                                     void              *p_thread_func_arg,
                                     const char        *p_thread_name,
                                     uint32_t           thread_stack_size,
                                     uint32_t           thread_Priority);
/**
 * \brief 线程初始化
 *
 * @param p_thread_func     线程运作函数
 * @param p_thread_func_arg 线程运作函数参数
 * @param p_thread_name     线程名字
 * @param thread_stack_size 线程栈大小
 * @param p_thread_stack    线程栈缓存
 * @param thread_Priority   线程优先级
 * @param p_thread          线程结构体
 *
 * @return 成功返回 0
 */
int Wed_thread_init(Wed_thread_func_t  p_thread_func,
                    void              *p_thread_func_arg,
                    const char        *p_thread_name,
                    uint32_t           thread_stack_size,
                    uint8_t           *p_thread_stack,
                    uint32_t           thread_Priority,
                    struct Wed_thread *p_thread);
#endif
